template <typename T>
T Min_3 (const T a, const T b, const T c)
{
	
	if (a<b && a<c)
	{
		return a;
	}
	else if (b<c && b<c)
	{
		return b;
	}
		return c;
}

template <typename T>
T Max_3 (const T a, const T b, const T c)
{
	if (a>b && a>c)
	{
		return a;
	}
	else if (b>c && b>c)
	{
		return b;
	}
		return c;
}

template <typename T>
void swap_a_b (T *pa, T *pb)
//Функція обміну змінних
{
	T tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int Fibonachi(int count)
{
	if (count < 1)
	{
		return 0;
	}
	if (count == 1)
	{
		return 1;
	}
	return (Fibonachi(count-2) + Fibonachi(count-1));
}	

template <typename T>
T find_min(const T &a, const T &b)
{
	return (a<b)? a : b;
}
template <typename T>
T find_max(T &a, const T &b)
{
	return (a>b)? a : b;
}

template <typename T>
unsigned long long Factorial (T *x)
//Факторіал числа переданого по вказівнику
{
	if ((int)*x==0) return 1;
	if ((int)*x==1) return 1;
	
	unsigned long long f= 1;
	for (int i= 2; i<= (int)*x; i++)
	{
		f *= i;
	}
	return f;

}

template <typename T>
double pow (float *a, T *n)
//Піднесення числа у степіть
{
	//*n = (int)*n
	double p = *a;
	if (*a==0) return 0;
	if ((int)*n==0) return 1;
	
	for (int i= 1; i< (int)*n; i++)
	{
		p *= *a;
	}
	return p;
}

long long pow (int *a, int *n)
//Піднесення числа у степіть
{
	long long p = *a;
	if (*a==0) return 0;
	if (*n==0) return 1;
	
	for (int i= 1; i< *n; i++)
	{
		p *= *a;
	}
	return p;
}

template <typename T>
int Move_Line
(
		T * index_col,			//індексний масив
		const size_t position,	//позиція об"єкта
		const signed int ofset,	//зміщення (+/-) відносно позиції
		const size_t capacity	//ємність матриці у відповідному напрямку
);
		//Переміщення стрічки або стовбця не рівноміної динамічної матриці
		//	0 - позиція або ціль виходять за межі існуючої матриці
		//	1 - переміщення виконано успішно


